#ifndef ESTRATEGIAALMACENAMIENTOREGISTRO_H_
#define ESTRATEGIAALMACENAMIENTOREGISTRO_H_

#include <string>
#include "../Constantes.h"
#include "../FuncionesUtiles.h"
#include "EstrategiaAlmacenamiento.h"

using namespace std;
class RecursoDeAlmacenamiento;
class IteradorRegistrosFijos;

/*
 * Funcion: Clase que organiza el almacenamiento de registros de tamanio fijo.
 */

class EstrategiaAlmacenamientoRegistro: public EstrategiaAlmacenamiento {

friend class IteradorRegistrosFijos;

private:
	cantBytes tamanioRegistro;
	cantBytes tamanioRegistroSerializado;
	void completarHeader(Bytes& header);

public:

	/*
	 * Pre: -
	 * Pos: crea una nueva instancia.
	 */
	EstrategiaAlmacenamientoRegistro(cantBytes tamanioRegistro);

	/*
	 * Pre: -
	 * Pos: Libera los recursos instanciados.
	 */
	virtual ~EstrategiaAlmacenamientoRegistro();

	/*
	 * Pre: -
	 * Pos: Guarda el dato.
	 */
	virtual bool guardar(const Bytes& bytes, long& numeroComponente);

	/*
	 * Pre: -
	 * Pos: devuelve el dato.
	 */
	virtual Bytes obtener(offset numeroComponente, Key clave = Key(), TipoClave* extractor = NULL);

	/*
	 * Pre: -
	 * Pos: elimina el dato.
	 */
	virtual bool eliminar(offset numeroComponente, Key clave = Key(), TipoClave* extractor = NULL);

	/*
	 * Pre: -
	 * Pos: devuelve si el header esta corrupto.
	 */
	bool headerCorrupto();

	/*
	 * Pre: -
	 * Pos: devuelve la cantidad de registros.
	 */
	unsigned getCantRegistros();

	/*
	 * Pre: -
	 * Pos: devuelve un iterador para recorrer los registros.
	 */
	Iterador* getIterador();

};

#endif /* ESTRATEGIAALMACENAMIENTOREGISTRO_H_ */
